package cl.leshowski.agendaUC.fabrica;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


import cl.leshowski.agendaUC.modelo.EventoAgenda;
import cl.leshowski.agendaUC.modelo.Fecha;
import cl.leshowski.comun.manejaProperties;

public class fabricaXMLAgendaUC {
	
	public static void generaXML(Fecha fechaEntrada,
								 ArrayList<EventoAgenda> listaEventos_,
								 boolean generaPrimeraVez,
								 int nroSecuencia) throws Exception{
		
		String rutaXML = manejaProperties.entregaValor("conf/general.properties", "rutaXML");
		
		 try {
			 
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
		 
				//root
				Document doc = docBuilder.newDocument();
				Element listaEventos = doc.createElement("listaEventos");
				
				//se agregan las fechas
				listaEventos.setAttribute("anio",fechaEntrada.getAnio());
				listaEventos.setAttribute("mes",fechaEntrada.getMes());
				listaEventos.setAttribute("dia",fechaEntrada.getDia());
				
				doc.appendChild(listaEventos);
				
				for(int i=0;i<listaEventos_.size();i++){
					
					EventoAgenda eventoAgendaTemp = listaEventos_.get(i);
					
					Element evento = doc.createElement("evento");
					
					Element titulo = doc.createElement("titulo");
					titulo.appendChild(doc.createTextNode(eventoAgendaTemp.getTitulo()==null?"":eventoAgendaTemp.getTitulo()));
					evento.appendChild(titulo);
					
					Element fecha = doc.createElement("fecha");
					fecha.appendChild(doc.createTextNode(eventoAgendaTemp.getFecha()==null?"":eventoAgendaTemp.getFecha()));
					evento.appendChild(fecha);
					
					Element horario = doc.createElement("horario");
					horario.appendChild(doc.createTextNode(eventoAgendaTemp.getHorario()==null?"":eventoAgendaTemp.getHorario()));
					evento.appendChild(horario);
					
					Element lugar = doc.createElement("lugar");
					lugar.appendChild(doc.createTextNode(eventoAgendaTemp.getLugar()==null?"":eventoAgendaTemp.getLugar()));
					evento.appendChild(lugar);
					
					Element descripcion = doc.createElement("descripcion");
					descripcion.appendChild(doc.createTextNode(eventoAgendaTemp.getDescripcion()==null?"":eventoAgendaTemp.getDescripcion()));
					evento.appendChild(descripcion);
					
					Element urlImagen = doc.createElement("urlImagen");
					urlImagen.appendChild(doc.createTextNode(eventoAgendaTemp.getUrlImagen()==null?"":eventoAgendaTemp.getUrlImagen()));
					evento.appendChild(urlImagen);
					
					Element url = doc.createElement("url");
					url.appendChild(doc.createTextNode(eventoAgendaTemp.getUrl()==null?"":eventoAgendaTemp.getUrl()));
					evento.appendChild(url);
					
					Element urlCorta = doc.createElement("urlCorta");
					urlCorta.appendChild(doc.createTextNode(eventoAgendaTemp.getUrlCorta()==null?"":eventoAgendaTemp.getUrlCorta()));
					evento.appendChild(urlCorta);
					
					Element seleccionado = doc.createElement("seleccionado");
					
					if(generaPrimeraVez)
						seleccionado.appendChild(doc.createTextNode(i==0?"S":"N"));
					else
						seleccionado.appendChild(doc.createTextNode(eventoAgendaTemp.getSeleccionado()==null?"":eventoAgendaTemp.getSeleccionado()));
					
					evento.appendChild(seleccionado);
					
					listaEventos.appendChild(evento);
				}
				
				listaEventos.setAttribute("nroSecuencia",String.valueOf(nroSecuencia));
		 
				// write the content into xml file
				TransformerFactory transformerFactory = TransformerFactory.newInstance();
				Transformer transformer = transformerFactory.newTransformer();
				DOMSource source = new DOMSource(doc);
				StreamResult result = new StreamResult(new File(rutaXML));
		 
				// Output to console for testing
				// StreamResult result = new StreamResult(System.out);
		 
				transformer.transform(source, result);
		 
				//System.out.println("File saved!");
		 
			  }/* catch (ParserConfigurationException pce) {
				pce.printStackTrace();
			  } catch (TransformerException tfe) {
				tfe.printStackTrace();
			  }*/
		 		catch(Exception e){
		 			throw e;
		 		}
			}
	
	public static EventoAgenda cargaEventoMarcado(ArrayList<EventoAgenda> eventoAgenda){
		
		if(eventoAgenda == null)
			eventoAgenda = new ArrayList<EventoAgenda>();
		
		for(int i=0;i<eventoAgenda.size();i++){
			
			if(eventoAgenda.get(i).getSeleccionado().equals("S"))
				return eventoAgenda.get(i);
		}
		return null;
	}
	
	public static int elijeSiguienteEvento(ArrayList<EventoAgenda> eventoAgenda,int nroSecuencia){
		
		int nroSecuenciaTemp = nroSecuencia;
		
		if(eventoAgenda == null)
			eventoAgenda = new ArrayList<EventoAgenda>();
		
		for(int i=0;i<eventoAgenda.size();i++){
			
			if(eventoAgenda.get(i).getSeleccionado().equals("S")){
			
				eventoAgenda.get(i).setSeleccionado("N");
				
				if((i+1)>=eventoAgenda.size()){
					
					eventoAgenda.get(0).setSeleccionado("S");
					nroSecuenciaTemp++;
				}
				else
					eventoAgenda.get(i+1).setSeleccionado("S");
				
				break;
			}
		}
		
		return nroSecuenciaTemp;
	}
	
	public static ArrayList<EventoAgenda> cargaXML() throws Exception{
		
		ArrayList<EventoAgenda> listaEventos = new ArrayList<EventoAgenda>();
		
		try{
			
			String rutaXML = manejaProperties.entregaValor("conf/general.properties", "rutaXML");
		
			File xmlArchivo = new File(rutaXML);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlArchivo);
			doc.getDocumentElement().normalize();
			
			NodeList nList = doc.getDocumentElement().getElementsByTagName("evento");
			
			for (int i = 0; i < nList.getLength(); i++) {
				 
				Node eventoTemp = nList.item(i);
				
				if (eventoTemp.getNodeType() == Node.ELEMENT_NODE) {
					 
				      Element eventoTempElemento = (Element) eventoTemp;
		 
				      EventoAgenda eventoAgendaTemp = new EventoAgenda();
				      
				      eventoAgendaTemp.setTitulo(getTagValue("titulo", eventoTempElemento));
			          eventoAgendaTemp.setDescripcion(getTagValue("descripcion", eventoTempElemento));
			    	  eventoAgendaTemp.setFecha(getTagValue("fecha", eventoTempElemento));
			    	  eventoAgendaTemp.setHorario(getTagValue("horario", eventoTempElemento));
			    	  eventoAgendaTemp.setLugar(getTagValue("lugar", eventoTempElemento));
			    	  eventoAgendaTemp.setUrl(getTagValue("url", eventoTempElemento));
			    	  eventoAgendaTemp.setUrlImagen(getTagValue("urlImagen", eventoTempElemento));
			    	  eventoAgendaTemp.setSeleccionado(getTagValue("seleccionado", eventoTempElemento));
			    	  eventoAgendaTemp.setUrlCorta(getTagValue("urlCorta", eventoTempElemento));
			    	  
			    	  listaEventos.add(eventoAgendaTemp);
				      
				}
			}
			
			return listaEventos;
			
		}catch(Exception e){
			throw e;
		}
	}
	
	private static String getTagValue(String sTag, Element eElement) throws Exception {
		
		try{
		
			NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
			 
	        Node nValue = (Node) nlList.item(0);
	 
		return nValue.getNodeValue();
			
		}catch(NullPointerException e){
			
			return "";
		}catch(Exception e){
			throw e;
		}
	  }
	
	public static int obtieneNroSecuenciaListaEventos() throws Exception{	
		
		int nroSecuenciaListaEventos = 1;
		
		try{
			
			String rutaXML = manejaProperties.entregaValor("conf/general.properties", "rutaXML");
			
			File xmlArchivo = new File(rutaXML);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlArchivo);
			doc.getDocumentElement().normalize();
			
			Element nodoRoot = (Element)doc.getElementsByTagName("listaEventos").item(0);
			
			nroSecuenciaListaEventos = Integer.parseInt(nodoRoot.getAttribute("nroSecuencia")==null?"1":nodoRoot.getAttribute("nroSecuencia"));
							  
			return nroSecuenciaListaEventos;
	        			
		}catch(Exception e){
			throw e;
		}	
	}
	
	public static Fecha obtieneFechaListaEventos() throws Exception{
		
		Fecha fecha = null;
		
		try{
			
			String rutaXML = manejaProperties.entregaValor("conf/general.properties", "rutaXML");
			
			File xmlArchivo = new File(rutaXML);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlArchivo);
			doc.getDocumentElement().normalize();
			
			Element nodoRoot = (Element)doc.getElementsByTagName("listaEventos").item(0);
			
			fecha = new Fecha(nodoRoot.getAttribute("dia"),
							  nodoRoot.getAttribute("mes"),
							  nodoRoot.getAttribute("anio"));
			
			return fecha;
	        			
		}catch(FileNotFoundException e){
			
			fecha = new Fecha("",
					  "",
					  "");
			
			return fecha;
		}
		
		catch(Exception e){
			throw e;
		}	
	}
	
	public static boolean existeArchivoXML() throws Exception{
		
		try{
			
			String rutaXML = manejaProperties.entregaValor("conf/general.properties", "rutaXML");
			
			File xmlArchivo = new File(rutaXML);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlArchivo);
			doc.getDocumentElement().normalize();
			
			return true;
						
		}catch(FileNotFoundException e){
			return false;
		}
		catch(Exception e){
			throw e;
		}	
	}
}
